﻿/*************************************************************************************

- CLR版本：        4.0.30319.42000
- 类 名 称：       ToolIOMonitor
- 机器名称：       YTE
- 命名空间：       LD.Tool.BC
- 文 件 名：       ToolIOMonitor
- 创建时间：       2022/7/28 8:59:49
- 作    者：       YTE
- 说   明：
- 修改时间：
- 修 改 人：
  *************************************************************************************/

using LD.BC;
using LD.Host;
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace LD.Tool
{
    [Tool(FrmParam = "ToolIOMonitorFrm", Text = "IO监控", ToolType = ToolEnum.BC)]
    class ToolIOMonitor : BaseTool
    {
        public override OpResult Execute(TB_Tool model)
        {
            stopwatch.Start();
            isSuccess = false;
            try
            {
                var param = Newtonsoft.Json.JsonConvert.DeserializeObject<IoMonitor>(model.Param);
                if (param != null)
                {
                    var io = BcFactory.Instance.Config.IoList
                               .Where(p => p.IoType == param.IoType &&
                                           p.Name == param.IoName)
                               .FirstOrDefault();
                    if (io != null)
                    {
                        int low_hig = -1;

                        //timeout监控
                        if (param.IsTimeOut)
                        {
                            Stopwatch start = new Stopwatch();
                            start.Start();
                            while (start.ElapsedMilliseconds < param.TimeOut && !BCAlertHelper.GetErrorQty)
                            {
                                if (param.IoType == (int)IoType.输入)
                                    low_hig = BcFactory.Instance.Control.GetIn(io.No);
                                else
                                    low_hig = BcFactory.Instance.Control.GetOut(io.No);

                                if (low_hig == param.Low_Hig)
                                {
                                    isSuccess = true;
                                    break;
                                }
                                Task.Delay(5).Wait();
                            }
                            start.Stop();
                        }
                        else
                        {
                            while (!BCAlertHelper.GetErrorQty)
                            {
                                if (param.IoType == (int)IoType.输入)
                                    low_hig = BcFactory.Instance.Control.GetIn(io.No);
                                else
                                    low_hig = BcFactory.Instance.Control.GetOut(io.No);

                                if (low_hig == param.Low_Hig)
                                {
                                    isSuccess = true;
                                    break;
                                }
                                Task.Delay(10).Wait();
                            }
                        }
                        if (!isSuccess)
                            message = io.Name + "未到位";
                    }
                    else
                        Log(model, "IO信息无法获取", LogLevel.警告);
                }
            }
            catch (Exception ex)
            {
                isSuccess = false;
                message = ex.Message;
                Log(model, message, LogLevel.严重);
            }
            finally
            {
                stopwatch.Stop();
            }
            return new OpResult() { IsSuccess = isSuccess, Message = message, ExecuteTime = stopwatch.ElapsedMilliseconds };
        }
    }
}
